﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using ShareIt_MVC3.Models;
using System.Diagnostics;

namespace ShareIt_MVC3.Controllers
{
     // Diese Klasse dient zur Kontrolle der einzelnen Views in den Angelegenheiten des Users und zur Weiterleitung auf diese.
    public class UsersController : MainController
    {
        
        // GET: /Users/
        /// <summary>
        /// Hier wird auf die User-hauptseite weitergeleitet und falls der Admin eingeloggt ist ihm alle user übergeben.
        /// </summary>
        /// <returns></returns>
        [Authorize(Roles="Admin")]
        public ActionResult Index()
        {
            List<User> users = userColl.GetAllUsers();
            return View(users);
        }

        
        // GET: /Users/Details/5
        /// <summary>
        /// Hier wird auf die Details weitergeleitet und geprüft ob der eingeloggte User Admin ist.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize(Roles = "Admin")]
        public ActionResult Details(int id)
        {
            return View();
        }

        
        // GET: /Users/Create
        /// <summary>
        /// Methode zum Erstellen von Benutzern (konstruktor).
        /// </summary>
        /// <returns></returns>
        [Authorize(Roles="Admin")]
        public ActionResult Create()
        {
            return View();
        } 

        //
        // POST: /Users/Create
        /// <summary>
        /// Hier wird auf die Create Seite weitergeleitet und auf einen create befehl gewartet. wird dieser erteilt, wird geprüft ob die eingaben validiert werden können. Wenn ja wird der User eingefügt, wenn nicht wird auf die Seite zurückverwiesen.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        // 
        [Authorize(Roles = "Admin")]
        [HttpPost]
        public ActionResult Create(User user)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    // TODO: Add insert logic here
                    userColl.InsertUser(user);
                }
                catch { }

                return RedirectToAction("Index");
            }
            else
            {
                return View();
            }
            
        }
        

        // GET: /Users/Edit/5
        /// <summary>
        /// Hier wird auf die Ansicht zum editieren verwiesen. Davor wird jedoch geprüft ob der User auch berechtigt ist diese Daten zu verändern. Nur der Admin oder der jeweilige User dürfen die Benutzerdaten ändern.
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        [Authorize]
        public ActionResult Edit(int id)
        {
            // Zugriffsrechte prüfen. Entweder man ist Admin, 
            // oder der Benutzer selbst möchte seine Daten ändern.
            // Falls nicht, Permission denied anzeigen.
            if (!(MyUser.IsAdmin || id == MyUser.ID))
                return View("Shared/_PermissionDenied");

            User user = userColl.GetUserById(id);
            user.ConfirmPassword = user.Password;

            return View(user);
        }

        
        // POST: /Users/Edit/5
        /// <summary>
        /// Methode zum Editieren eines Benutzers. Übergeben werden eine ID und ein user-Objekt.
        /// </summary>
        /// <param name="id"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        [Authorize]
        [HttpPost]
        public ActionResult Edit(int id, User user)
        {
            // Zugriffsrechte prüfen. Entweder man ist Admin, 
            // oder der Benutzer selbst möchte seine Daten ändern.
            // Falls nicht, Permission denied anzeigen.
            if (!(MyUser.IsAdmin || id == MyUser.ID))
                return View("Shared/_PermissionDenied");
                            
            User currentUser = userColl.GetUserById(user.ID);
            user.Username = currentUser.Username;

            if (!MyUser.IsAdmin)
            {    
                user.Credits = currentUser.Credits;
                user.IsAdmin = currentUser.IsAdmin;
            }
                               
            if (ModelState.IsValid)
            {
                userColl.UpdateUser(user);
                return RedirectToAction("Index", "MyResources");
            }
            else
            {
                return View(user);
            }

        }

        /// <summary>
        /// Register- View wird aufgerufen, wenn keine Werte übergeben werden.
        /// </summary>
        /// <returns></returns>
        public ActionResult Register()
        {
            return View();
        }

        
     
        /// <summary>
        ///  Methode für das Registrieren. Hier wird der User erstmal als "Normaler" Benutzer eingestuft und ihm ein Credit gutgeschrieben.
        /// </summary>
        /// <param name="user"></param>
        /// <returns></returns>
        [HttpPost]
        public ActionResult Register(User user)
        {

            if (ModelState.IsValid)
            {
                user.IsAdmin = false;
                user.Active = true;
                user.Credits = 1;
                
                try
                {
                    userColl.InsertUser(user);
                }
                catch
                {
                    ModelState.AddModelError("", "Bitte versuchen sie einen anderen Benutzernamen und / oder E-Mail Adresse!");
                    return View(user);
                }
            }
            else
            {
                return View(user);
            }

            TempData["success"] = "Sie haben sich erfolgreich registriert!";
            return RedirectToAction("LogOn","Account");
        }
    }
}
